package cn.lingxue.lingapi.utils;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;

public class ResponseResult<T> implements Serializable {

    /** 响应码 **/
    public Integer code;

    /** 响应信息 **/
    public String message;

    /** 响应数据 **/
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public T data;

    /** 响应时间 **/
    public Long timestamp;

    /**
     * 响应成功
     *
     * @author 多仔ヾ
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> success() {
        return resp(ResponseStatus.SUCCESS.code, ResponseStatus.SUCCESS.message, null);
    }

    /**
     * 响应成功
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> success(String message) {
        return resp(ResponseStatus.SUCCESS.code, message, null);
    }

    /**
     * 响应成功
     *
     * @author 多仔ヾ
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> success(T data) {
        return resp(ResponseStatus.SUCCESS.code, ResponseStatus.SUCCESS.message, data);
    }

    /**
     * 响应成功
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> success(String message, T data) {
        return resp(ResponseStatus.SUCCESS.code, message, data);
    }

    /**
     * 响应失败
     *
     * @author 多仔ヾ
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> failure() {
        return resp(ResponseStatus.FAILURE.code, ResponseStatus.FAILURE.message, null);
    }

    /**
     * 响应失败
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> failure(String message) {
        return resp(ResponseStatus.FAILURE.code, message, null);
    }

    /**
     * 响应失败
     *
     * @author 多仔ヾ
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> failure(T data) {
        return resp(ResponseStatus.FAILURE.code, ResponseStatus.FAILURE.message, data);
    }

    /**
     * 响应失败
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> failure(String message, T data) {
        return resp(ResponseStatus.FAILURE.code, message, data);
    }

    /**
     * 响应异常
     *
     * @author 多仔ヾ
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> error() {
        return resp(ResponseStatus.ERROR.code, ResponseStatus.ERROR.message, null);
    }

    /**
     * 响应异常
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> error(String message) {
        return resp(ResponseStatus.ERROR.code, message, null);
    }

    /**
     * 响应异常
     *
     * @author 多仔ヾ
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> error(T data) {
        return resp(ResponseStatus.ERROR.code, ResponseStatus.ERROR.message, data);
    }

    /**
     * 响应异常
     *
     * @author 多仔ヾ
     * @param message 响应信息
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> error(String message, T data) {
        return resp(ResponseStatus.ERROR.code, message, data);
    }

    /**
     * 响应结果
     *
     * @author 多仔ヾ
     * @param code 响应码
     * @param message 响应信息
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> resp(Integer code, String message) {
        return resp(code, message, null);
    }

    /**
     * 响应结果
     *
     * @author 多仔ヾ
     * @param responseStatus 响应状态
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> resp(ResponseStatus responseStatus) {
        return resp(responseStatus.code, responseStatus.message, null);
    }

    /**
     * 响应结果
     *
     * @author 多仔ヾ
     * @param code 响应码
     * @param msg 响应信息
     * @param data 响应数据
     * @return 响应结果实体
     **/
    public static <T> ResponseResult<T> resp(Integer code, String msg, T data) {
        ResponseResult<T> responseResult = new ResponseResult<>();
        responseResult.code = code;
        responseResult.message = msg;
        responseResult.data = data;
        responseResult.timestamp = System.currentTimeMillis() / 1000L;
        return responseResult;
    }

}
